-- $LastChangedDate: 2007-06-01 02:52:33 +0200 (Fri, 01 Jun 2007) $
-- $LastChangedRevision: 149 $
-- $LastChangedBy: vicente $

-- packages de ada

SEPARATE (Tareas.Gaparatos)

   -- Se encarga de completar un ejercicio de un determinado cliente
   -- en base a los datos del cliente se aplicara cierta probabilidad
   -- de que haya alguna emergencia.
   -- En el caso de una emergencia, problemas valdra true y la maquina
   -- correspondiente notificara al gestor de monitores que hay una
   -- emergencia.
PROCEDURE Realizar_Ejercicio (
      Ej         : IN     Ejerciciotype;
      T          : IN     Duration;
      Cliente    :        Datosclienteptr;
      G          : IN     Generator;
      Medicion   :    OUT Medicionbiometrica;
      Emergencia :    OUT Boolean) IS

   FUNCTION Calcular_Medicion (
         G    : IN     Generator;
         Edad :        Tipoedad)
     RETURN Tipomedicion IS
   SEPARATE;

BEGIN

   Medicion := (
      Ejercicio  => Ej,
      Ritmo      => Calcular_Medicion(G, Cliente.Edad),
      Tension    => Calcular_Medicion(G, Cliente.Edad),
      Frecuencia => Calcular_Medicion(G, Cliente.Edad));

   -- Si alguna de las mediciones es muy alta o muy baja se produce una emergencia
   IF Medicion.Ritmo = Muy_Bajo OR Medicion.Ritmo = Muy_Alto
         OR Medicion.Tension = Muy_Bajo OR Medicion.Tension = Muy_Alto
         OR Medicion.Frecuencia = Muy_Bajo OR Medicion.Frecuencia = Muy_Alto THEN
      Emergencia:= True;
      -- en este caso el tiempo de entreno es aleatorio hasta que se produce la emergencia
      -- el valor ira entre 0 .. T
      DELAY T * Duration(Random(G));
   ELSE
      -- todas las mediciones han sido normales, altas o bajas
      Emergencia := False;
      -- entrenamos
      DELAY T;
   END IF;

END Realizar_Ejercicio;
